package com.bw.park2301.notice

import androidx.paging.PagingSource
import androidx.paging.PagingState

import com.bw.lib_base.entity.NoticeBeanItem
import com.bw.lib_base.net.ApiService

/**
 * NoticeDataSource 类提供了分页获取通知数据的功能
 * 它继承自 PagingSource，并实现了必要的方法来支持分页加载
 *
 * @param apiService 用于网络请求的 API 服务接口
 */
class NoticeDataSource(apiService: ApiService): PagingSource<Int,NoticeBeanItem>() {
    // 声明一个 lateinit 变量 apiService，用于在初始化后进行赋值
    lateinit var apiService: ApiService

    // 初始化块，用于给 apiService 变量赋值
    init {
        this.apiService = apiService
    }

    /**
     * 获取刷新键，用于在刷新时确定从哪个页面开始加载
     *
     * @param state 当前的分页状态
     * @return Int? 返回 null 表示不需要特定的刷新键
     */
    override fun getRefreshKey(state: PagingState<Int, NoticeBeanItem>): Int? {
        return null
    }

    /**
     * 加载指定页面的数据
     *
     * @param params 加载参数，包含要加载的页面信息
     * @return LoadResult<Int, NoticeBeanItem> 返回加载结果，包括数据、前一页和下一页的页码
     */
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, NoticeBeanItem> {
        try {
            // 获取当前页面，如果没有指定则默认为 0
            val currentPage = params.key?:0
            // 请求当前页面的通知数据
            val notices = apiService.getNotices(currentPage, 10)
            // 确定下一页的页码，如果当前页数据满 10 条则下一页页码为当前页码+1，否则为 null
            val nextPage = if (notices.data.size == 10) currentPage+1 else null
            // 返回加载结果，包括数据、前一页（null）和下一页的页码
            return LoadResult.Page(notices.data,null,nextPage)
        }catch (e: Exception){
            // 如果发生异常，返回错误结果
            return LoadResult.Error(e)
        }
    }
}
